package donnees.dao;

import donnees.modele.Acteur;
import donnees.modele.Journaliste;
import donnees.modele.Participant;
import donnees.modele.Producteur;
import donnees.modele.Realisateur;
import donnees.modele.Sponsor;
import donnees.modele.Vip;
import donnees.outils.HibernateUtil;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

public class VipDao implements VipInterface {

    private Session session;

    // Ajout
    @Override
    public void ajouterVip(Vip v) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.save(v);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible d'ajouter le VIP !");
        } finally {
            session.close();
        }
    }

    @Override
    public void ajouterActeur(Acteur a) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.save(a);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible d'ajouter l'acteur !");
        } finally {
            session.close();
        }
    }

    @Override
    public void ajouterJournaliste(Journaliste j) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.save(j);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible d'ajouter le journaliste !");
        } finally {
            session.close();
        }
    }

    @Override
    public void ajouterParticipant(Participant p) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.save(p);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible d'ajouter le participant !");
        } finally {
            session.close();
        }
    }

    @Override
    public void ajouterProducteur(Producteur p) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.save(p);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible d'ajouter le producteur !");
        } finally {
            session.close();
        }
    }

    @Override
    public void ajouterRealisateur(Realisateur r) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.save(r);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible d'ajouter le réalisateur !");
        } finally {
            session.close();
        }
    }

    @Override
    public void ajouterSponsor(Sponsor s) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.save(s);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible d'ajouter le sponsor !");
        } finally {
            session.close();
        }
    }

    // MODIFICATION
    @Override
    public void modifierVip(Vip v) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.merge(v);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de modifier le VIP !");
        } finally {
            session.close();
        }
    }

    @Override
    public void modifierActeur(Acteur a) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.merge(a);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de modifier l'acteur !");
        } finally {
            session.close();
        }
    }

    @Override
    public void modifierJournaliste(Journaliste j) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.merge(j);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de modifier le journaliste !");
        } finally {
            session.close();
        }
    }

    @Override
    public void modifierParticipant(Participant p) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.merge(p);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de modifier le participant !");
        } finally {
            session.close();
        }
    }

    @Override
    public void modifierProducteur(Producteur p) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.merge(p);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de modifier le producteur !");
        } finally {
            session.close();
        }
    }

    @Override
    public void modifierRealisateur(Realisateur r) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.merge(r);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de modifier le réalisateur !");
        } finally {
            session.close();
        }
    }

    @Override
    public void modifierSponsor(Sponsor s) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.merge(s);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de modifier le sponsor !");
        } finally {
            session.close();
        }
    }

    // SUPPRESSION
    @Override
    public void supprimerVip(Vip v) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.delete(v);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de supprimer le VIP !");
        } finally {
            session.close();
        }
    }

    @Override
    public void supprimerActeur(Acteur a) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.delete(a);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de supprimer l'acteur !");
        } finally {
            session.close();
        }
    }

    @Override
    public void supprimerJournaliste(Journaliste j) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.delete(j);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de supprimer le journaliste !");
        } finally {
            session.close();
        }
    }

    @Override
    public void supprimerParticipant(Participant p) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.delete(p);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de supprimer le participant !");
        } finally {
            session.close();
        }
    }

    @Override
    public void supprimerProducteur(Producteur p) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.delete(p);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de supprimer le producteur !");
        } finally {
            session.close();
        }
    }

    @Override
    public void supprimerRealisateur(Realisateur r) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.delete(r);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de supprimer le réalisateur !");
        } finally {
            session.close();
        }
    }

    @Override
    public void supprimerSponsor(Sponsor s) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            session.delete(s);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            throw new Exception("Impossible de supprimer le sponsor !");
        } finally {
            session.close();
        }
    }

    // LE DERNIER DE CHAQUE TYPE EST BUGGé
    @Override
    public String trouverTypeVip(Vip v) throws Exception {
        String id = v.getId();
        if (trouverParticipant(id) != null) {
            // C'est un participant
            if (trouverActeur(id) != null) {
                return "acteur";
            } else if (trouverRealisateur(id) != null) {
                return "realisateur";
            } else if (trouverProducteur(id) != null) {
                return "producteur";
            }
        } else if (trouverJournaliste(id) != null) {
            return "journaliste";
        } else if (trouverSponsor(id) != null) {
            return "sponsor";
        }
        return "autre";
    }

    @Override
    public Acteur trouverActeur(String id) {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        Criteria cr = session.createCriteria(Acteur.class).add(Restrictions.eq("id", id));
        Acteur a = (Acteur) (cr.uniqueResult());
        session.close();
        if (a == null) {
            return null;
        } else {
            return a;
        }
    }

    @Override
    public Journaliste trouverJournaliste(String id) {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        Criteria cr = session.createCriteria(Journaliste.class).add(Restrictions.eq("id", id));
        Journaliste j = (Journaliste) (cr.uniqueResult());
        session.close();
        if (j == null) {
            return null;
        } else {
            return j;
        }
    }

    @Override
    public Participant trouverParticipant(String id) {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        Criteria cr = session.createCriteria(Participant.class).add(Restrictions.eq("id", id));
        Participant p = (Participant) (cr.uniqueResult());
        session.close();
        if (p == null) {
            return null;
        } else {
            return p;
        }
    }

    @Override
    public Producteur trouverProducteur(String id) {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        Criteria cr = session.createCriteria(Producteur.class).add(Restrictions.eq("id", id));
        Producteur p = (Producteur) (cr.uniqueResult());
        session.close();
        if (p == null) {
            return null;
        } else {
            return p;
        }
    }

    @Override
    public Realisateur trouverRealisateur(String id) {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        Criteria cr = session.createCriteria(Realisateur.class).add(Restrictions.eq("id", id));
        Realisateur r = (Realisateur) (cr.uniqueResult());
        session.close();
        if (r == null) {
            return null;
        } else {
            return r;
        }
    }

    @Override
    public Sponsor trouverSponsor(String id) {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        Criteria cr = session.createCriteria(Sponsor.class).add(Restrictions.eq("id", id));
        Sponsor s = (Sponsor) (cr.uniqueResult());
        session.close();
        if (s == null) {
            return null;
        } else {
            return s;
        }
    }

    @Override
    public Vip trouverVip(String id) {
        session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        Criteria cr = session.createCriteria(Vip.class).add(Restrictions.eq("id", id));
        Vip v = (Vip) (cr.uniqueResult());
        session.close();
        if (v == null) {
            return null;
        } else {
            return v;
        }
    }

    @Override
    public Vip trouverVipParNom(String nom) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        Criteria cr = session.createCriteria(Vip.class).add(Restrictions.eq("nom", nom));
        Vip v = (Vip) (cr.uniqueResult());
        session.close();
        if (v == null) {
            throw new Exception("Impossible de trouver le VIP !");
        } else {
            return v;
        }
    }

    @Override
    public List listerVip() throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        List results;
        Criteria cr = session.createCriteria(Vip.class);
        results = (List) cr.list();
        session.close();
        if (results.isEmpty()) {
            throw new Exception("Impossible de lister les VIP !");
        } else {
            return results;
        }

    }

    @Override
    public List listerVipParType(String type) throws Exception {
        session = HibernateUtil.getSessionFactory().openSession();
        List results;
        if (type.equals("acteur") || type.equals("journaliste") || type.equals("participant") || type.equals("producteur") || type.equals("realisateur") || type.equals("sponsor")) {
            Query cr = session.createQuery("from " + type);
            results = (List) cr.list();
            session.close();
            if (results.isEmpty()) {
                throw new Exception("Impossible de lister les VIP !");
            } else {
                return results;
            }
        } else {
            session.close();
            throw new Exception("Aucun VIP n'est " + type + " !");
        }
    }
}
